package cn.wen.java.nio;

import java.io.UnsupportedEncodingException;

/**
 * Title：字符编码操作类
 * <p>
 * Description：提供字符串——编码处理、进制转换等。Encoder API 提供的静态方法。该类没有实例。
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2010/7/23 Description：初完成。
 *          <p>
 */
public abstract class Encoder {

    /**
     * 将字符串按encoding编码格式进行编码，并生成新字符串
     * 
     * @param content 待转换编码的字符串
     * @param encoding 目标编码
     * @return 重新编码后的字符串
     * @throws UnsupportedEncodingException
     */
    public static String toNew(String content, String encoding) throws UnsupportedEncodingException {
	if (content == null) {
	    return null;
	}
	return new String(content.getBytes(), encoding);
    }

    /**
     * 将字符串从指定的oldEncoding编码格式转换成encoding编码格式，并生成新字符串
     * 
     * @param content 待转换编码的字符串
     * @param oldEncoding 原编码
     * @param dtsEncoding 目标编码
     * @return 重新编码后的字符串
     * @throws UnsupportedEncodingException
     */
    public static String toNewFromOld(String content, String oldEncoding, String dtsEncoding)
	    throws UnsupportedEncodingException {
	if (content == null) {
	    return null;
	}
	return new String(content.getBytes(oldEncoding), dtsEncoding);
    }

    /**
     * 将字节数组中的所有元素转换为十六进制，并返回。
     * <p>
     * Method by Santeri Paavolainen, Helsinki Finland 1996<br>
     * (c) Santeri Paavolainen, Helsinki Finland 1996<br>
     * Distributed under LGPL.
     * 
     * @param bytes 字节数组。
     * @return 转换后的十六进制字符串。
     */
    public static String toHexString(byte[] bytes) {
	StringBuilder sb = new StringBuilder(bytes.length * 2);
	for (int i = 0; i < bytes.length; i++) {
	    int hex = (int) bytes[i] & 0xff;
	    if (hex < 0x10) sb.append("0");
	    sb.append(Long.toString(hex, 16));
	}
	return sb.toString();
    }

    /**
     * 将字符串转换为十六进制，并返回。
     * 
     * @param str 字符串。
     * @return 转换后的十六进制字符串。
     */
    public static String toHexString(String str) {
	return toHexString(str.getBytes());
    }

    /**
     * 将十六进制还原为字符串。toHexString的是反操作。
     * 
     * @param hexString 十六进制串。
     * @return 字符串。
     * @see #toHexString
     */
    public static String hex2String(String hexString) {
	return new String(hex2Byte(hexString));
    }

    /**
     * 将十六进制还原为字节数组。toHexString的是反操作。
     * <p>
     * Method by Santeri Paavolainen, Helsinki Finland 1996<br>
     * (c) Santeri Paavolainen, Helsinki Finland 1996<br>
     * Distributed under LGPL.
     * 
     * @param hexString 十六进制字符串。
     * @return 转换后的字节数组。
     * @see #toHexString
     */
    public static byte[] hex2Byte(String hexString) {
	char[] chars = hexString.toCharArray();
	byte[] bytes = new byte[chars.length / 2];
	int byteCount = 0;
	for (int i = 0; i < chars.length; i += 2) {
	    byte newByte = 0x00;
	    newByte |= hexChar2Byte(chars[i]);
	    newByte <<= 4;
	    newByte |= hexChar2Byte(chars[i + 1]);
	    bytes[byteCount] = newByte;
	    byteCount++;
	}
	return bytes;
    }

    /**
     * 十六进制字符对应的字节
     * 
     * @param ch 十六进制字符
     * @return 字节
     */
    public static byte hexChar2Byte(char ch) {
	switch (ch) {
	case '0':
	    return 0x00;
	case '1':
	    return 0x01;
	case '2':
	    return 0x02;
	case '3':
	    return 0x03;
	case '4':
	    return 0x04;
	case '5':
	    return 0x05;
	case '6':
	    return 0x06;
	case '7':
	    return 0x07;
	case '8':
	    return 0x08;
	case '9':
	    return 0x09;
	case 'a':
	    return 0x0A;
	case 'b':
	    return 0x0B;
	case 'c':
	    return 0x0C;
	case 'd':
	    return 0x0D;
	case 'e':
	    return 0x0E;
	case 'f':
	    return 0x0F;
	}
	return 0x00;
    }

    /**
     * 字节转字符
     * 
     * @param bt 字节
     * @return 字符
     */
    public static char toChar(byte bt) {
	return (char) bt;
    }

}
